home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / gnu / nethack.lha / nethack-3.1 / src / sit.c < prev    next >
C/C++ Source or Header  |  1992-12-04  |  9KB  |  362 lines

  1. /*    SCCS Id: @(#)sit.c    3.1    92/10/24    */
  2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  3. /* NetHack may be freely redistributed.  See license for details. */
  4.  
  5. #include "hack.h"
  6. #include "artifact.h"
  7.  
  8. void
  9. take_gold()
  10. {
  11.     if (u.ugold <= 0)  {
  12.         You("feel a strange sensation.");
  13.     } else {
  14.         You("notice you have no gold!");
  15.         u.ugold = 0;
  16.         flags.botl = 1;
  17.     }
  18. }
  19.  
  20. int
  21. dosit()
  22. {
  23.     char pbuf[BUFSZ];
  24.     register struct trap *trap;
  25.     register int typ = levl[u.ux][u.uy].typ;
  26.  
  27.     if(Levitation)  {
  28.         pline("There's nothing to sit on up here.");
  29.         return 0;
  30.     } 
  31.  
  32.     Strcpy(pbuf, "You sit on the %s.");
  33.  
  34.     if(OBJ_AT(u.ux, u.uy)) { 
  35.         register struct obj *obj;
  36.  
  37.         obj = level.objects[u.ux][u.uy];
  38.         You("sit on %s.", the(xname(obj)));
  39.         if(!Is_box(obj)) pline("It is not very comfortable...");
  40.  
  41.     } else if(trap = t_at(u.ux, u.uy)) {
  42.  
  43.         if(u.utrap) {
  44.             if(u.utraptype == TT_BEARTRAP) {
  45.             You("can't sit down!");
  46.             u.utrap++;
  47.             } else if(u.utraptype == TT_PIT) {
  48.             You("sit in the bottom of the pit.");
  49.             if(trap->ttyp == SPIKED_PIT) pline("This hurts!");
  50.             u.utrap += rn2(5);
  51.         } else if(u.utraptype == TT_WEB) {
  52.             pline(pbuf, "giant spider's web");
  53.             You("are further entangled!");
  54.             u.utrap += rn1(10, 5);
  55.         } else if(u.utraptype == TT_LAVA) {
  56.             /* Must have fire resistance or they'd be dead already */
  57.             You("sit in the lava!");
  58.             u.utrap += rnd(4);
  59.             losehp(d(2,10), "sitting in lava", KILLED_BY);
  60.         } else if(u.utraptype == TT_INFLOOR) {
  61.             You("can't maneuver to sit!");
  62.             u.utrap++;
  63.         }
  64.         } else {
  65.             You("sit down.");
  66.         dotrap(trap);
  67.         }
  68.     } else if(Underwater || Is_waterlevel(&u.uz)) {
  69.         if (Is_waterlevel(&u.uz))
  70.         pline("There are no seats floating in the neighborhood.");
  71.         else
  72.         You("sit down in the muddy bottom.");
  73.     } else if(is_pool(u.ux, u.uy)) {
  74.  
  75.         You("sit in the water.");
  76.         if (!rn2(10) && uarm)
  77.         (void) rust_dmg(uarm, "armor", 1, TRUE);
  78. #ifdef POLYSELF
  79.         /* Note: without POLYSELF, this can't _happen_ without */
  80.         /* water walking boots.... */
  81.         if (!rn2(10) && uarmf && uarmf->otyp != WATER_WALKING_BOOTS)
  82.         (void) rust_dmg(uarm, "armor", 1, TRUE);
  83. #endif
  84. #ifdef SINKS
  85.     } else if(IS_SINK(typ)) {
  86.  
  87.         pline(pbuf, defsyms[S_sink].explanation);
  88.         Your("%s gets wet.", humanoid(uasmon) ? "rump" : "underside");
  89. #endif
  90.     } else if(IS_ALTAR(typ)) {
  91.  
  92.         pline(pbuf, defsyms[S_altar].explanation);
  93.         altar_wrath(u.ux, u.uy);
  94.  
  95.     } else if(typ == STAIRS) {
  96.  
  97.         pline(pbuf, "stairs");
  98.  
  99.     } else if(typ == LADDER) {
  100.  
  101.         pline(pbuf, "ladder");
  102.  
  103.     } else if (is_lava(u.ux, u.uy)) {
  104.  
  105.         /* must be WWalking */
  106.         pline(pbuf, "lava");
  107.         pline("It burns you!");
  108.         losehp(d((Fire_resistance ? 2 : 10), 10),
  109.            "sitting on lava", KILLED_BY);
  110.  
  111.     } else if (is_ice(u.ux, u.uy)) {
  112.  
  113.         pline(pbuf, defsyms[S_ice].explanation);
  114.         if (!Cold_resistance) pline("It's very cold...");
  115.  
  116.     } else if (typ == DRAWBRIDGE_DOWN) {
  117.  
  118.         pline(pbuf, "drawbridge");
  119.  
  120.     } else if(IS_THRONE(typ)) {
  121.  
  122.         pline(pbuf, defsyms[S_throne].explanation);
  123.         if (rnd(6) > 4)  {
  124.         switch (rnd(13))  {
  125.             case 1:
  126.             (void) adjattrib(rn2(A_MAX), -rn1(4,3), FALSE);
  127.             losehp(rnd(10), "cursed throne", KILLED_BY_AN);
  128.             break;
  129.             case 2:
  130.             (void) adjattrib(rn2(A_MAX), 1, FALSE);
  131.             break;
  132.             case 3:
  133.         pline("A%s charge of electricity shoots through your body!",
  134.                   (Shock_resistance) ? "" : " massive");
  135.             if(Shock_resistance)
  136.                 losehp(rnd(6), "electric chair", KILLED_BY_AN);
  137.             else    losehp(rnd(30), "electric chair", KILLED_BY_AN);
  138.             exercise(A_CON, FALSE);
  139.             break;
  140.             case 4:
  141.             You("feel much, much better!");
  142.             if(u.uhp >= (u.uhpmax - 5))  u.uhpmax += 4;
  143.             u.uhp = u.uhpmax;
  144.             make_blinded(0L,TRUE);
  145.             make_sick(0L,FALSE);
  146.             heal_legs();
  147.             flags.botl = 1;
  148.             break;
  149.             case 5:
  150.             take_gold();
  151.             break;
  152.             case 6:
  153.             if(u.uluck + rn2(5) < 0) {
  154.                 You("feel your luck is changing.");
  155.                 change_luck(1);
  156.             } else        makewish();
  157.             break;
  158.             case 7:
  159.             {
  160.             register int cnt = rnd(10);
  161.  
  162.             You("hear a voice echo:");
  163.             verbalize("Thy audience hath been summoned, %s!",
  164.                   flags.female ? "Dame" : "Sire");
  165.             while(cnt--)
  166.                 (void) makemon(courtmon(), u.ux, u.uy);
  167.             break;
  168.             }
  169.             case 8:
  170.             You("hear a voice echo:");
  171.             verbalize("By thy Imperious order, %s...",
  172.                   flags.female ? "Dame" : "Sire");
  173.             do_genocide(1);
  174.             break;
  175.             case 9:
  176.             You("hear a voice echo:");
  177.     verbalize("A curse upon thee for sitting upon this most holy throne!");
  178.             if (Luck > 0)  {
  179.                 make_blinded(Blinded + rn1(100,250),TRUE);
  180.             } else        rndcurse();
  181.             break;
  182.             case 10:
  183.             if (Luck < 0 || (HSee_invisible & INTRINSIC))  {
  184.                 if (level.flags.nommap) {
  185.                     pline(
  186.                     "A terrible drone fills your head!");
  187.                     make_confused(HConfusion + rnd(30),
  188.                                     FALSE);
  189.                 } else {
  190.                     pline("An image forms in your mind.");
  191.                     do_mapping();
  192.                 }
  193.             } else  {
  194.                 Your("vision clarifies.");
  195.                 HSee_invisible |= FROMOUTSIDE;
  196.                 newsym(u.ux, u.uy);
  197.             }
  198.             break;
  199.             case 11:
  200.             if (Luck < 0)  {
  201.                 You("feel threatened.");
  202.                 aggravate();
  203.             } else  {
  204.  
  205.                 You("feel a wrenching sensation.");
  206.                 tele();        /* teleport him */
  207.             }
  208.             break;
  209.             case 12:
  210.             You("are granted a gift of insight!");
  211.             if (invent) {
  212.                 int ret, cval = rn2(5); /* agrees w/seffects() */
  213.                 do {
  214.                 ret = ggetobj("identify", identify, cval);
  215.                 } while (cval && (cval -= ret));
  216.             }
  217.             break;
  218.             case 13:
  219.             Your("mind turns into a pretzel!");
  220.             make_confused(HConfusion + rn1(7,16),FALSE);
  221.             break;
  222.             default:    impossible("throne effect");
  223.                 break;
  224.         }
  225.         } else    You("feel somehow out of place...");
  226.  
  227.         if (!rn2(3) && IS_THRONE(levl[u.ux][u.uy].typ)) {
  228.         /* may have teleported */
  229.         pline("The throne vanishes in a puff of logic.");
  230.         levl[u.ux][u.uy].typ = ROOM;
  231.         if(Invisible) newsym(u.ux,u.uy);
  232.         }
  233.  
  234. #ifdef POLYSELF
  235.     } else if (lays_eggs(uasmon) || u.umonnum == PM_QUEEN_BEE) {
  236.         struct obj *uegg;
  237.  
  238.         if (!flags.female) {
  239.             pline("Males can't lay eggs!");
  240.             return 0;
  241.         }
  242.  
  243.         if (u.uhunger < (int)objects[EGG].oc_nutrition) {
  244.             You("are too weak to lay an egg.");
  245.             return 0;
  246.         }
  247.  
  248.         uegg = mksobj(EGG, FALSE, FALSE);
  249.         uegg->spe = 1;
  250.         uegg->quan = 1;
  251.         uegg->owt = weight(uegg);
  252.         uegg->corpsenm =
  253.             (u.umonnum==PM_QUEEN_BEE ? PM_KILLER_BEE : monsndx(uasmon));
  254.         uegg->known = uegg->dknown = 1;
  255.         You("lay an egg.");
  256.         dropy(uegg);
  257.         stackobj(uegg);
  258.         morehungry((int)objects[EGG].oc_nutrition);
  259. #endif
  260.     } else if (u.uswallow)
  261.         pline("There are no seats in here!");
  262.     else
  263.         pline("Having fun sitting on the floor?");
  264.     return(1);
  265. }
  266.  
  267. void
  268. rndcurse()            /* curse a few inventory items at random! */
  269. {
  270.     int    nobj = 0;
  271.     int    cnt, onum;
  272.     struct    obj    *otmp;
  273.  
  274.     if(Antimagic) {
  275.         shieldeff(u.ux, u.uy);
  276.         You("feel a malignant aura surround you.");
  277.     }
  278.  
  279.     for (otmp = invent; otmp; otmp = otmp->nobj)  nobj++;
  280.  
  281.     if (nobj)
  282.         for (cnt = rnd(6/((!!Antimagic) + (!!Half_spell_damage) + 1));
  283.          cnt > 0; cnt--)  {
  284.         onum = rn2(nobj);
  285.         for(otmp = invent; onum != 0; onum--)
  286.             otmp = otmp->nobj;
  287.  
  288.         if(otmp->oartifact && spec_ability(otmp, SPFX_INTEL) &&
  289.            rn2(10) < 8) {
  290.             pline("%s resists!", The(xname(otmp)));
  291.             continue;
  292.         }
  293.  
  294.         if(otmp->blessed)
  295.             unbless(otmp);
  296.         else
  297.             curse(otmp);
  298.         }
  299. }
  300.  
  301. void
  302. attrcurse()            /* remove a random INTRINSIC ability */
  303. {
  304.     switch(rnd(10)) {
  305.     case 1 : if (HFire_resistance & INTRINSIC) {
  306.             HFire_resistance &= ~INTRINSIC;
  307.             You("feel warmer.");
  308.             break;
  309.         }
  310.     case 2 : if (HTeleportation & INTRINSIC) {
  311.             HTeleportation &= ~INTRINSIC;
  312.             You("feel less jumpy.");
  313.             break;
  314.         }
  315.     case 3 : if (HPoison_resistance & INTRINSIC) {
  316.             HPoison_resistance &= ~INTRINSIC;
  317.             You("feel a little sick!");
  318.             break;
  319.         }
  320.     case 4 : if (HTelepat & INTRINSIC) {
  321.             HTelepat &= ~INTRINSIC;
  322.             if (Blind && !Telepat)
  323.                 see_monsters();    /* Can't sense mons anymore! */
  324.             Your("senses fail!");
  325.             break;
  326.         }
  327.     case 5 : if (HCold_resistance & INTRINSIC) {
  328.             HCold_resistance &= ~INTRINSIC;
  329.             You("feel cooler.");
  330.             break;
  331.         }
  332.     case 6 : if (HInvis & INTRINSIC) {
  333.             HInvis &= ~INTRINSIC;
  334.             You("feel paranoid.");
  335.             break;
  336.         }
  337.     case 7 : if (HSee_invisible & INTRINSIC) {
  338.             HSee_invisible &= ~INTRINSIC;
  339.             You("thought you saw something!");
  340.             break;
  341.         }
  342.     case 8 : if (Fast & INTRINSIC) {
  343.             Fast &= ~INTRINSIC;
  344.             You("feel slower.");
  345.             break;
  346.         }
  347.     case 9 : if (Stealth & INTRINSIC) {
  348.             Stealth &= ~INTRINSIC;
  349.             You("feel clumsy.");
  350.             break;
  351.         }
  352.     case 10: if (Protection & INTRINSIC) {
  353.             Protection &= ~INTRINSIC;
  354.             You("feel vulnerable.");
  355.             break;
  356.         }
  357.     default: break;
  358.     }
  359. }
  360.  
  361. /*sit.c*/
  362.